﻿' ******************************************************************************
' ** 
' **  Yahoo Finance Managed
' **  Written by Marius Häusler 2010
' **  It would be pleasant, if you contact me when you are using this code.
' **  Contact: YahooFinanceManaged@gmail.com
' **  Project Home: http://code.google.com/p/yahoo-finance-managed/
' **  
' ******************************************************************************
' **  
' **  Copyright 2010 Marius Häusler
' **  
' **  Licensed under the Apache License, Version 2.0 (the "License");
' **  you may not use this file except in compliance with the License.
' **  You may obtain a copy of the License at
' **  
' **    http://www.apache.org/licenses/LICENSE-2.0
' **  
' **  Unless required by applicable law or agreed to in writing, software
' **  distributed under the License is distributed on an "AS IS" BASIS,
' **  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
' **  See the License for the specific language governing permissions and
' **  limitations under the License.
' ** 
' ******************************************************************************


Namespace Finance.Support

    ''' <summary>
    ''' Class for downloading exchange data
    ''' </summary>
    ''' <remarks></remarks>
    Public Class ExchangeRateDownload
        Inherits API.QuotesBaseDownload

        ''' <summary>
        ''' Raises if an asynchronous download of exchange rates completes
        ''' </summary>
        ''' <param name="sender">The event raising object</param>
        ''' <param name="ea">The event args of the asynchronous download</param>
        ''' <remarks></remarks>
        Public Event AsyncRateDownloadCompleted(ByVal sender As Base.Download, ByVal ea As ExchangeRateDownloadCompletedEventArgs)

        ''' <summary>
        ''' Downloads a list of currency exchange rates
        ''' </summary>
        ''' <param name="currencies">List of all currency-pairs</param>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Public Overloads Function Download(ByVal currencies() As YCurrencyID) As ExchangeRateResponse
            If currencies Is Nothing Then : Throw New ArgumentNullException("currencies", "The passed currencies have no values.")
            Else : Return Me.ToResponse(MyBase.Download(mFinanceHelper.IIDsToStrings(currencies)))
            End If
        End Function
        ''' <summary>
        ''' Starts an asynchronous download of currency exchange rates
        ''' </summary>
        ''' <param name="currencies">List of all currency-pairs</param>
        ''' <param name="userArgs">Individual user argument</param>
        ''' <remarks></remarks>
        Public Overloads Sub DownloadAsync(ByVal currencies() As YCurrencyID, Optional ByVal userArgs As Object = Nothing)
            If currencies Is Nothing Then : Throw New ArgumentNullException("currencies", "The passed currencies have no values.")
            Else
                Dim args As New AsyncDownloadArgs(userArgs, currencies)
                MyBase.DownloadAsync(mFinanceHelper.IIDsToStrings(args.Currencies), args)
            End If
        End Sub

        ''' <summary>
        ''' Default constructor
        ''' </summary>
        ''' <remarks></remarks>
        Public Sub New()
        End Sub

        Private Sub DownloadAsync_Completed(ByVal sender As Base.Download, ByVal ba As API.QuotesBaseDownloadCompletedEventArgs) Handles MyBase.AsyncDownloadCompleted
            If ba IsNot Nothing Then
                Dim userArgs As Object = Nothing
                Dim curs() As Support.YCurrencyID = Nothing

                If ba.UserArgs IsNot Nothing AndAlso TypeOf ba.UserArgs Is ExchangeRateDownload.AsyncDownloadArgs Then
                    Dim dlArgs As AsyncDownloadArgs = DirectCast(ba.UserArgs, AsyncDownloadArgs)
                    userArgs = dlArgs.UserArgs
                    curs = dlArgs.Currencies
                Else
                    userArgs = ba.UserArgs
                    Dim lst As New List(Of Support.YCurrencyID)
                    For Each id In ba.IDs
                        Dim curID As YCurrencyID = mFinanceHelper.YCurrencyIDFromString(id)
                        If curID IsNot Nothing Then lst.Add(curID)
                    Next
                    curs = lst.ToArray
                End If

                Dim args As New ExchangeRateDownloadCompletedEventArgs(userArgs, Me.ToResponse(ba.Response), curs)
                RaiseEvent AsyncRateDownloadCompleted(Me, args)
            End If
        End Sub

        Private Function ToResponse(ByVal resp As API.QuotesBaseResponse) As ExchangeRateResponse
            Dim lst As New List(Of ExchangeRateData)
            If resp.Result IsNot Nothing Then
                For Each q As QuoteBaseData In resp.Result
                    Dim cur As YCurrencyID = mFinanceHelper.YCurrencyIDFromString(q.ID)
                    If cur IsNot Nothing Then lst.Add(New ExchangeRateData(cur.BaseCurrency, cur.DepCurrency, q))
                Next
            End If
            Return New ExchangeRateResponse(resp.Connection, lst.ToArray)
        End Function

        Private Class AsyncDownloadArgs
            Inherits Base.DownloadEventArgs
            Public Currencies() As YCurrencyID
            Public Sub New(ByVal userArgs As Object, ByVal curs() As YCurrencyID)
                MyBase.New(userArgs)
                Me.Currencies = curs
            End Sub
        End Class

    End Class

    ''' <summary>
    ''' Stores the received exchange rate informations of an asynchronous download
    ''' </summary>
    ''' <remarks></remarks>
    Public Class ExchangeRateDownloadCompletedEventArgs
        Inherits Base.DownloadCompletedEventArgs

        Private mCurrencies() As YCurrencyID

        Public ReadOnly Property Currencies() As YCurrencyID()
            Get
                Return mCurrencies
            End Get
        End Property
        Public Overloads ReadOnly Property Response() As ExchangeRateResponse
            Get
                Return DirectCast(MyBase.Response, ExchangeRateResponse)
            End Get
        End Property

        Friend Sub New(ByVal userArgs As Object, ByVal resp As ExchangeRateResponse, ByVal curs() As YCurrencyID)
            MyBase.New(userArgs, resp)
            mCurrencies = curs
        End Sub

    End Class

    Public Class ExchangeRateResponse
        Inherits Base.Response

        Public Overloads ReadOnly Property Result() As ExchangeRateData()
            Get
                Return TryCast(MyBase.Result, ExchangeRateData())
            End Get
        End Property

        Friend Sub New(ByVal info As Base.ConnectionInfo, ByVal result As ExchangeRateData())
            MyBase.New(info, result)
        End Sub

    End Class

End Namespace